就算再怎麼不擅長,每天寫文章連續20天以上,也慢慢的越來越熟練,相信自己可以透過文章這種分享,給大家一些東西,表達自己的一些想法。
寫程式也是同樣的道理,寫得越多就越來越熟練。
GoF 四人幫所出的書Design Pattern中共有二十三種設計模式,隨著時間一天一天的過去,每天每寫一種Pattern素材就少了一種,來到今天正好第23天了,其中定義出還沒介紹的模式也剩下不多了。
仲介者模式(Mediator)用一個仲介物件來封裝一系列的物件互動。仲介者使個物件不需要顯式地互相參考,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。
-- 大話設計模式 p.378
看越多越覺得各種pattern很像啊~
這次仲介者模式的UML圖跟Bridge Pattern有一個差別,各個Concrete Mediator需要知道每個Concrete Colleague是誰(這樣仲介才有辦法轉送資訊啊)。
同樣轉送資訊的模式有Adapter、Bridge、Mediator等這些(結構型)模式,通常會根據需求選擇,使用相對簡單易懂的模式。結構型模式意思是要把結構從比較複雜變成簡單易懂(容易修改擴展),如果為了模式而實作模式那反而可能會造成程式複雜化呢!
小程序員做不來要請老闆幫忙
公司的介面
public interface Company {
public void addMember(CoWorker coWorker);
public void introduce(CoWorker coWorker);
public void workHard();
public void giveWork(CoWorker coWorker);
}
員工的介面
public abstract class CoWorker {
String name;
Boss boss;
public CoWorker(String name){
this.name = name;
}
public abstract void work();
}
公司下面的老闆
import java.util.ArrayList;
import java.util.List;
public class Boss implements Company{
List<CoWorker> coWorkers;
public Boss(){
coWorkers = new ArrayList<>();
}
@Override
public void addMember(CoWorker coWorker){
coWorkers.add(coWorker);
coWorker.boss = this;
}
@Override
public void introduce(CoWorker coWorker) {
System.out.println("Boss:跟大家介紹這位是" + coWorker.name);
}
@Override
public void workHard() {
for (CoWorker c: coWorkers
) {
System.out.println("Boss:" + c.name + "認真點做啊!");
}
}
@Override
public void giveWork(CoWorker coWorker) {
System.out.println("Boss:" + coWorker.name + "這個幫忙一下。");
}
}
PM
public class PM extends CoWorker {
public PM(String name) {
super(name);
}
@Override
public void work() {
System.out.println(this.name + "做PM工作");
}
public void bossHelp(CoWorker coWorker){
this.boss.giveWork(coWorker);
}
}
Programmer
public class Programmer extends CoWorker {
public Programmer(String name) {
super(name);
}
@Override
public void work() {
System.out.println(this.name + "寫程式");
}
}
測試一下
public class Test {
@org.junit.jupiter.api.Test
public void test(){
// 無名的Boss
Boss boss = new Boss();
// 各個員工
PM wei = new PM("小偉");
Programmer bad = new Programmer("小惡");
Programmer good = new Programmer("阿仁");
// 把員工加入Boss下面管理
boss.addMember(wei);
boss.addMember(bad);
boss.addMember(good);
// Boss介紹新來的小惡
boss.introduce(bad);
// 阿仁自己工作
good.work();
// boss請大家專心工作
boss.workHard();
// 小惡自己做不來
// PM請老闆幫忙
wei.bossHelp(bad);
}
}
結果
Boss:跟大家介紹這位是小惡
阿仁寫程式
Boss:小偉認真點做啊!
Boss:小惡認真點做啊!
Boss:阿仁認真點做啊!
Boss:小惡這個幫忙一下。
今天介紹仲介者模式到這邊,有什麼問題歡迎留言或是有什麼好想法可以分享給我~感恩。